/*
 * @Author: HeAo
 * @Date: 2022-08-18 14:23:12
 * @LastEditTime: 2022-08-21 21:33:59
 * @LastEditors: HeAo
 * @Description: 
 * @FilePath: \JavaScripe\day-09\02-自定义构造函数.js
 * 别乱动！
 */
/*自定义构造函数
目的：为解决工厂模式的类型模糊的问题而生 
*/
function Person(name, age, gender) {
  this.name = name
  this.age = age
  this.gender = gender
  this.sayName = function () {
    console.log(this.name);
  }
}
// 1、new-说明Person当作一个自定义构造函数  this存在于Person中，被p1调用，所有this指向p1 同理p2
var p1 = new Person('zhangsan', 18, 'male')
var p2 = new Person('lisi', 16, 'female')
console.log(p1); //p1对象
console.log(p2);
// // 相当于我们之前的 obj.sayName() 对象名+点函数=读取对象中的某个属性
// p1.sayName() //zhangsan
// p2.sayName() //lisi

// // 2、以普通函数调用构造函数（不推荐这么使用）
// Person('wangwu', 16, 'male')
// sayName() //wangwu

// 3、使用instanceof 判断一个对象是某个对象的实例(Object——Person——p1)
// console.log(p1 instanceof Person); //true
// console.log(p1 instanceof Object); //true

// 4、自定义函数的弊端（缺点）
console.log(p1.sayName === p2.sayName); //false

/*
优点：解决了工厂模式的对象类型模糊问题
缺点：当调用对象中的方法时（p1.sayName()）会重新定义新方法，会造成p1
一个sayName  p2一个sayName，此时占据更多内存
*/